//
//  Stack.swift
//  数据结构与算法
//
//  Created by ZERO on 2021/1/9.
//

import Foundation

// MARK: - 栈
/// 栈
struct Stack<T> {
    /// 声明一个泛型数组，用于存储栈中的元素(栈结构的后备存储器)
    private var elements = [T]()
    /// 返回栈结构中元素的个数
    var count: Int {
        return elements.count
    }
    /// 获取或者设置栈的存储容量
    var capacity: Int {
        // 获取栈的存储容量
        get {
            // 返回数组elements的容量
            return elements.capacity
        }
        // 设置栈的最大容量
        set {
            // 设置数组elements的最大容量
            elements.reserveCapacity(newValue)
        }
    }
    
    /// 入栈
    mutating func push(element: T) {
        elements.append(element)
    }
    
    /// 出栈
    @discardableResult
    mutating func pop() -> T? {
        if count == 0 {
            fatalError("栈已空，不能再执行出栈操作！")
        }
        return elements.popLast()
    }
    
    /// 返回栈顶元素
    func peek() -> T? {
        return elements.last
    }
    
    /// 清空栈
    mutating func clear() {
        elements.removeAll()
    }
    
    /// 判断栈是否为空
    func isEmpty() -> Bool {
        return elements.isEmpty
    }
    
    /// 判断栈是否已满
    func isFull() -> Bool {
        if count == 0 {
            return false
        } else {
            return count == elements.capacity
        }
    }
}

// MARK: - 遵守CustomStringConvertible和CustomDebugStringConvertible协议
extension Stack: CustomStringConvertible, CustomDebugStringConvertible {
    var description: String {
        return elements.description
    }
    
    var debugDescription: String {
        return elements.debugDescription
    }
}

// MARK: - 遵守ExpressibleByArrayLiteral协议
extension Stack: ExpressibleByArrayLiteral {
    // 为Stack增加类似于数组的字面量初始化方法
    init(arrayLiteral elements: T...) {
        self.init()
        for element in elements {
            self.elements.append(element)
        }
    }
}
